package com.lyf.juc.practice;

import org.junit.Test;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * JUC的基础学习
 * 1.线程的基本状态
 * 2.CAS+AQS基础理论
 * 3.线程的创建与使用
 * 4.阻塞队列、数据结构
 * 5.工具类（
 * 6.锁！！ →  并发、协作
 * 7.线程池
 * 8.并发框架
 * 9.应用场景
 *
 * @author LYF
 * @date 2022/6/23
 */
public class JucTests {
    /*
    线程的基本知识
                              RUNNING
                            →
    NEW_RUNNABLE   →  READY       STOP       WAIT
    结合OS：
    1.理解线程的五状态、七状态模型，线程与进程的关系
    2.线程的目标是抢夺CPU资源，准备好资源 等待拿取CPU进行执行
    调度策略：FIFO，LRU，时间占比； 抢夺/非抢夺型
    挂起：对换区--，内存与外存
     */
    public void test1(){
        //Thread.State

    }



    /*
    阻塞队列


     */
    public void test2(){
        BlockingQueue blockingQueue = new LinkedBlockingQueue();
        blockingQueue.offer(1);


    }
    Lock lock = new ReentrantLock();
    //1.按照指定顺序执行
    //2.锁分为互斥锁（互斥拿临界资源）和变量锁（控制协作）
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();
    @Test
    public void test3(){

        // 线程1
        new Thread(()->{
            lock.lock();// 抢锁
            try {
                c1.await(); // 消耗该变量
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 做事情
            System.out.println("执行 线程1 唤醒 线程2");

            c2.signal();
            lock.unlock();// 释放锁

        }).start();

        new Thread(()->{
            lock.lock();
            try {
                c2.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行 线程2 终止操作");
            lock.unlock();
        }).start();

//        System.out.println("抢锁 准备唤醒线程1 ");
//        lock.lock();
//        System.out.println("抢锁成功！ ");
//        c1.signal();
//        System.out.println("唤醒线程1");
//        lock.unlock();
//        System.out.println("释放锁");
    }


}
